#include <stdbool.h>
#include <stdlib.h>

#ifndef ABB_H
#define ABB_H

/* *********************************************************************
 *			DEFINICION DE LOS TIPOS DE DATO
 * ********************************************************************/

/* Arbol binario de busqueda */
typedef struct abb abb_avl_t;

typedef int (*abb_comparar_clave_t) (const char *, const char *);
typedef void (*abb_destruir_dato_t) (void *);

/* Iterador externo */
typedef struct abb_iter avl_iter_t;

/* *********************************************************************
 *			PRIMITIVAS DE ARBOL BINARIO DE BUSQUEDA
 * ********************************************************************/

abb_avl_t* avl_crear(abb_comparar_clave_t cmp, abb_destruir_dato_t destruir_dato);

bool avl_guardar(abb_avl_t *arbol, const char *clave, void *dato);

void *avl_borrar(abb_avl_t *arbol, const char *clave);

void *avl_obtener(const abb_avl_t *arbol, const char *clave);

bool avl_pertenece(const abb_avl_t *arbol, const char *clave);

size_t avl_cantidad(abb_avl_t *arbol);

size_t avl_altura(abb_avl_t *arbol);

void avl_destruir(abb_avl_t *arbol);

/* *********************************************************************
 * 				ITERADOR INTERNO
 * ********************************************************************/
 
void avl_in_order(abb_avl_t *arbol, bool funcion(const char *, void *, void *,void*), void *extra, void* extra2);

/* *********************************************************************
 * 				ITERADOR EXTERNO
 * ********************************************************************/
 
avl_iter_t *avl_iter_in_crear(const abb_avl_t *arbol);

bool avl_iter_in_avanzar(avl_iter_t *iter);

const char *avl_iter_in_ver_actual(const avl_iter_t *iter);

bool avl_iter_in_al_final(const avl_iter_t *iter);

void avl_iter_in_destruir(avl_iter_t* iter);


#endif //ABB_H
